//
//  RevanStatusListView.swift
//  weibo_swift
//
//  Created by 紫荆秋雪 on 16/12/25.
//  Copyright © 2016年 紫荆秋雪. All rights reserved.
//

import Foundation
// 微博数据列表视图模型

/*
 父类的选择
 - 如果类需要使用“KVC” 或者字典转模型框架设置对象值，类就需要继承自 NSObject
 - 如果类只是包装一些代码逻辑（写了一些函数），可以不用任何父类，好处：更加轻量级
 - 提示：如果用oc写，一律都继承自NSobject
 
 使命：负责微博的数据处理
 1、字典转模型
 2、下拉 / 上拉刷新数据处理
 */


// 上拉刷洗最大尝试次数
private let maxPullupTryTimes = 3

class RevanStatusListModel {
    //微博模型数组懒加载
    lazy var statusList = [RevanStatus]()
    /// 上拉刷新错误次数
    private var pullupErrorTimes = 0
    
    /// 加载微博列表
    ///
    /// - Parameters:
    ///   - pullup: 是否上拉刷新标 记
    ///   - completion: 完成回调[网络请求是否成功]
    func loadStatus(pullup: Bool, completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {
        //参数设置
        // since_id 取出数组中第一条微博的 id
        let since_id = pullup ? 0 : (statusList.first?.id ?? 0)
        // 上拉刷新，取出数组的最后一条微博的 id
        let max_id = !pullup ? 0 : (statusList.last?.id ?? 0)
        
        // 通过判断 “上拉刷新”、“试错次数”来共同决定是否让上拉刷新时去请求网络
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            //禁止是上拉刷新访问网络
            completion(true, false)
            return
        }
        
        
        //请求微博数据
        RevanNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            //1、字典转模型
            //模型数组
            guard let array = NSArray.yy_modelArray(with: RevanStatus.self, json: list ?? []) as? [RevanStatus] else {
                
                //网络加载失败
                completion(isSuccess, false)
                return
            }
            
            //2、拼接数组
            print("准备刷新\(array.last?.text)")
            if pullup {
                print("上拉刷新")
                //上拉刷新结束后，将结果拼接在数组的末尾
                self.statusList += array
            } else {
                print("下拉刷新")
                // 下拉刷新，应该将结果数组拼接在数组前面
                self.statusList = array + self.statusList
            }
            
            
            
            //3、完成回调
            // 判断网络请求数据个数
            if pullup && array.count == 0 {
                //没有请求到数组表示错误一次
                self.pullupErrorTimes += 1
                completion(isSuccess, false)
            } else {
                completion(isSuccess, true)
            }
        }
    }
}








